/**
 * @Author: 罗显
 * @CreateTime: 2025-05-07
 * @Version: 1.0
 */


package com.it.material.entity;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Data;


import javax.websocket.Decoder;
import java.util.Date;

@Data
public class NewsEntity {
    /*
     *id 主键
     * title 标题
     * content 内容
     * channelId 频道id
     * userId 用户id (自媒体人的主键 文章作者 展示时候根据这个id查询用户的昵称)
     * status 状态
     * createTime 创建时间
     * updateTime 更新时间
     * publishTime 发布时间
     * */
    private Long id;
    private String title;
    private String content;
    private Integer channelId;
    private Long userId;
    private Status status;
    private Date createTime;
    private Date updateTime;
    private Date publishTime;

    public enum Status {
        DRAFT(0, "草稿"),
        PENDING(1, "待审核"),
        APPROVED(2, "审核通过"),
        REJECTED(3, "审核失败");
        private final int code;
        private final String description;

        Status(int code, String description) {
            this.code = code;
            this.description = description;
        }
        /**
         * `@JsonValue` 注解
         *
         * 作用：告诉 Jackson 在序列化 UserStatus 枚举时，使用 getCode() 方法的返回值。
         *      序列化指的是将 Java 对象转换为 JSON 字符串的过程。
         *
         * 示例：
         *   当 UserEntity 对象的 userStatus 字段为 UserStatus.LOCKED 时，
         *   序列化为 JSON 后，该字段的值将是 -1 （LOCKED 的 code 值），而不是 "LOCKED" 或其索引值。
         */
        @JsonValue
        public int getCode() {
            return code;
        }

        public String getDescription() {
            return description;
        }

        /**
         * `@JsonCreator` 注解
         *
         * 作用：告诉 Jackson 在反序列化 UserStatus 枚举时，使用 fromCode() 方法来将 JSON 中的值转换为 UserStatus 枚举对象。
         *      反序列化指的是将 JSON 字符串转换为 Java 对象的过程。
         *
         * 示例：
         *   当 JSON 字符串中 UserEntity 对象的 userStatus 字段的值为 -1 时，
         *   Jackson 会调用 fromCode(-1) 方法来获取对应的 UserStatus 枚举对象（UserStatus.LOCKED）。
         */
        @JsonCreator
        public static NewsEntity.Status fromCode(int code) {
            for (NewsEntity.Status status : NewsEntity.Status.values()) {
                if (status.code == code) {
                    return status;
                }
            }
            throw new IllegalArgumentException("无效的文章状态代码: " + code);
        }
    }
}